import tkinter as tk
from tkinter import filedialog, messagebox
from tkinter import ttk
import pandas as pd
import random
import os

def on_entry_click(event):
    """点击事件处理函数，当点击输入框时，清除默认提示文本"""
    if entry.get() == placeholder_text:
       entry.delete(0, "end")  # 删除所有文本
       entry.insert(0, '')  # 插入空字符串

def on_focusout(event):
    """失去焦点事件处理函数，当输入框失去焦点时，如果没有输入内容，则恢复默认提示文本"""
    if entry.get() == '':
        entry.insert(0, placeholder_text)
        entry.config(fg='grey')  # 设置文本颜色为灰色

# 创建主窗口
root = tk.Tk()

# 设置窗口大小
root.geometry("800x800")

# 设置窗口标题
root.title("期末口试工具")

# 设置窗口背景颜色为蓝色
root.configure(bg='lightblue')

# 创建一个样式对象
style = ttk.Style()
style.theme_use('clam')  # 使用clam主题

# 配置按钮和输入框的样式
style.configure('TButton', font=('Arial', 12), foreground='black', background='lightblue')
style.configure('TEntry', font=('Arial', 12), foreground='black', background='white')

# 创建一个文本框来显示题目和答案
text_box = tk.Text(root, height=30, width=100, bg='white', fg='black')
text_box.pack(pady=20)

# 创建一个输入框用于输入随机题目数量，并添加提示文本
placeholder_text = "请输入随机题目数量"
entry = ttk.Entry(root, style='TEntry')
entry.insert(0, placeholder_text)
entry.pack(pady=10)

# 绑定事件处理函数
entry.bind('<FocusIn>', on_entry_click)
entry.bind('<FocusOut>', on_focusout)

# 创建一个变量来控制答案的显示与隐藏
show_answers = tk.BooleanVar()
show_answers.set(True)

# 用于存储Excel文件数据的列表
data = []

# 读取Excel文件并封装成函数
def load_excel():
    global data
    file_path = filedialog.askopenfilename(filetypes=[("Excel files", "*.xlsx")])
    if file_path:
        df = pd.read_excel(file_path)
        data = df.to_dict('records')  # 将DataFrame转换为列表
        messagebox.showinfo("提示", "Excel文件读取成功！")
    else:
        messagebox.showerror("错误", "未选择任何文件")

# 生成随机题目并显示
def generate_random_questions():
    if not data:
        messagebox.showerror("错误", "请先读取Excel文件")
        return
    
    try:
        num_questions = int(entry.get())
    except ValueError:
        messagebox.showerror("错误", "请输入一个有效的数字")
        return
    
    if num_questions <= 0 or num_questions > len(data):
        messagebox.showerror("错误", "请输入一个有效的题目数量")
        return
    
    random_questions = random.sample(data, num_questions)
    
    text_box.delete(1.0, tk.END)  # 清空文本框
    text_box.insert(tk.END, f"题目数量: {num_questions}\n\n")
    for index, row in enumerate(random_questions):
        text_box.insert(tk.END, f"序号: {index + 1}\n题目: {row['题目']}\n")
        if show_answers.get():
            text_box.insert(tk.END, f"答案: {row['答案']}\n\n")
        else:
            text_box.insert(tk.END, "\n")

# 创建一个按钮来读取Excel文件
load_button = ttk.Button(root, text="读取Excel文件", command=load_excel)
load_button.pack(pady=10)

# 创建一个按钮来生成随机题目
generate_button = ttk.Button(root, text="生成随机题目", command=generate_random_questions)
generate_button.pack(pady=10)

# 创建一个按钮来控制答案的显示与隐藏
def toggle_answers():
    show_answers.set(not show_answers.get())
    generate_random_questions()

answer_button = ttk.Button(root, text="显示/隐藏答案", command=toggle_answers)
answer_button.pack(pady=10)

# 创建一个按钮来下载Excel文件模板
def download_template():
    template_path = "template.xlsx"  # 假设模板文件名为template.xlsx
    if not os.path.exists(template_path):
        # 创建一个DataFrame，包含编号、题目、答案三个列
        df_template = pd.DataFrame(columns=['编号', '题目', '答案'])
        # 将DataFrame写入Excel文件
        df_template.to_excel(template_path, index=False)
    
    root.after(0, lambda: filedialog.asksaveasfilename(initialfile=template_path, defaultextension=".xlsx"))

download_button = ttk.Button(root, text="下载Excel文件模板", command=download_template)
download_button.pack(pady=10)

# 运行主循环
root.mainloop()
